/**
 * 订单模块
 */
const fs = require('fs');
const { getUniqueId } = require("../utils/time");
const { paginateArray, PAGE_SIZE } = require('../utils/page');
// const { isRequire } = require('../utils/common');

// 订单分类对象
const order = {
    "id": "",
    "userId": "", //下单人id
    "username": "", //下单人姓名
    "orderStatus": '1', //订单状态（1:待发货, 2:已完成, 3:已评价,）
    "totalAmount": 1, // 订单总金额
    "payTime": 1, // 支付时间
    "finishTime": 1, // 完成时间
    "remark": '', // 用户备注   
    "createTime": "", // 创建时间
    "updateTime": "", // 更新时间,
    // 订单商品列表
    "products": [
        {
            productId: '', // 商品id
            productName: '', // 商品名称
            productPrice: 1, // 商品价格
            productImage: '', // 商品图片
            num: 1, // 商品数量
            productNum: 999, // 商品库存
            productType: '', // 商品类别
            createTime: '', // 创建时间
            updateTime: '', // 更新时间
        }
    ],
    // 用户评价
    "evaluate": {
        "content": "", // 用户评价内容
        "evaluateTime": "", // 创建时间
    },
    // 商家回复
    "replay": {
        "content": "", // 回复评价内容
        "replayTime": "", // 创建时间
    }
}

// 订单数据文件地址
const filePath = './data/order.txt';

// 商品对象必填字段
const requireKeys = {
    "productId": "商品id",
    "productName": "商品名称",  
    "productPrice": "商品价格", 
    "productImage": "商品图片",
    "productType": "商品类型", 
    "num":2, // 已选数量
    "productNum": "商品库存",
}

/**
 * 查询所有订单并返回
 * @returns 
 */
async function readOrder() {
    try {
        const res = await fs.readFileSync(filePath, 'utf-8');
        const data = res.toString();
        // 判断是否有数据
        if (data) {
            const arr = JSON.parse(data);
            return Promise.resolve(arr);
        } else {
            return Promise.resolve([]);
        }
    } catch (error) {
        // 判断是否文件不存在
        if (String(error).indexOf('no such file or directory') !== -1) {
            return Promise.resolve([]);
        }
        return Promise.reject(error);
    }
}

/**
 * 添加或者更新订单信息
 * @param {*} content 订单信息
 * @returns 
 */
async function addOrder(content) {
    try {
        const { id } = content;
        const res = await readOrder();
        const index = res.findIndex((item) => item.id === id);
        if (index > -1) {
            res.splice(index, 1);
            res.unshift(content);
        }else{
            content.id = getUniqueId();
            const timestamp = Math.floor(Date.now() / 1000);
            content.payTime = timestamp;
            content.createTime = timestamp;
            content.updateTime = timestamp;
            res.unshift(content);
        }
        
        const data = JSON.stringify(res)
        await fs.writeFileSync(filePath, data);
        return Promise.resolve();
    } catch (error) {
        console.log(error);
        return Promise.reject();
    }
}

/**
 * 删除商品类别
 * @param {*} id 商品类别id
 * @returns 
 */
async function deleteOrder(query) {
    try {
        const res = await readOrder();
        const index = res.findIndex((item) => query.id === item.id);
        res.splice(index, 1);
        const data = JSON.stringify(res)
        await fs.writeFileSync(filePath, data);
        return Promise.resolve();
    } catch (error) {
        return Promise.reject();
    }
}

/**
 * 分页查询订单
 * @returns 
 */
async function queryOrder(params) {
    const { pageNum, pageSize, searchParams, userId } = params;
    try {
        const data = await readOrder();
        // 判断是否有数据
        if (data) {
            let arr = data;
            if(!userId){
                const pageResult = paginateArray(arr, pageNum, pageSize ? pageSize : PAGE_SIZE, searchParams )
                return Promise.resolve(pageResult);
            }else{
                arr = arr.filter((item) => item.userId === userId);
            }
            const pageResult = paginateArray(arr, pageNum, pageSize ? pageSize : PAGE_SIZE, searchParams )
            return Promise.resolve(pageResult);
        } else {
            return Promise.resolve([]);
        }
    } catch (error) {
        return Promise.reject(error);
    }
}

module.exports = { 
    order, 
    readOrder,
    addOrder,
    deleteOrder,
    queryOrder
}